package br.com.beautycenter.view;

import br.com.beautycenter.DAO.PersisteFuncionario;
import br.com.beautycenter.DAO.PersisteSessao;
import br.com.beautycenter.DAO.PersisteTratamento;
import br.com.beautycenter.Funcionalidades.Data;
import br.com.beautycenter.Funcionalidades.Relatorios;
import br.com.beautycenter.Relatorios.ChamadaRelatorios;
import br.com.beautycenter.bean.Funcionario;
import br.com.beautycenter.bean.Sessao;
import br.com.beautycenter.bean.Tratamento;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import org.joda.time.DateTime;

public class AtendimentosPorPeriodo extends javax.swing.JFrame {

    PersisteSessao persisteSessao = new PersisteSessao();
    PersisteTratamento persisteTratamento = new PersisteTratamento();
    PersisteFuncionario persisteFuncionario = new PersisteFuncionario();
    
    Funcionario funcionario = new Funcionario();
    
    ChamadaRelatorios chamadaRelatorios = new ChamadaRelatorios();
    
    int quantidadeAtendimentos = 0;
    Date inicio, fim;
    List<Sessao> listaSemana = new ArrayList<Sessao>();
    List<Sessao> listaFeriado = new ArrayList<Sessao>();
    List<Sessao> listaRecebimentos = new ArrayList<Sessao>();
    
    HashMap<String, List<Sessao>> mapaSemana = new HashMap<String, List<Sessao>>();
    HashMap<String, List<Sessao>> mapaFeriado = new HashMap<String, List<Sessao>>();
    
    public boolean validarData(){
        inicio = jDDataInicio.getDate(); fim = jDDataFim.getDate();
        
        if(inicio == null || fim == null){
            JOptionPane.showMessageDialog(null, "Preencha as datas.");
            return false;
        }else if(!Data.validarDataMaior(new DateTime(inicio.getTime()), new DateTime(fim.getTime()))){
            JOptionPane.showMessageDialog(null, "A data de início deve ser inferior ou igual a data final.");
            return false;
        }
        
        return true;
    }
    
    public boolean validarFuncionario(){
        if(jCFuncionario.getSelectedIndex() > 0){
            funcionario = new Funcionario();
            funcionario.setNome(jCFuncionario.getSelectedItem().toString());
            funcionario = persisteFuncionario.retornarFuncionarioPeloNome(funcionario).get(0);
            
            return true;
        }else{
            JOptionPane.showMessageDialog(null, "Selecione um funcionário.");
            return false;
        }
    }
    
    public void preencherComboFuncionario(){
        jCFuncionario.removeAllItems();
        jCFuncionario.addItem("Selecione um funcionário...");
        
        for(Sessao item: persisteSessao.retornarSessoesGrupoFuncionarios()){
            jCFuncionario.addItem(item.getFuncionario().getNome());
        }    
    }
    
    public void inicializarTela(){
        preencherComboFuncionario();
        jDDataInicio.setDate(new Date());
        jDDataFim.setDate(new Date());
    }
    
    public void criarMapas(){
        for(Sessao item: persisteSessao.retornarSessoesPeloPeriodoFuncionario(funcionario, inicio, fim)){
            //se foi feito o pagamento, mas houve uma falta, então vai para lista de recebimentos
            if(!item.isPresenca() && item.getPagamentoEfetuado() > 0) listaRecebimentos.add(item); 
            
            if(!Data.isFeriadoOuSabado(item.getDtSessao())){
                if(mapaSemana.containsKey(item.getTratamento().getNomeTratamento())){
                    mapaSemana.get(item.getTratamento().getNomeTratamento()).add(item);
                }else{
                    List<Sessao> value = new ArrayList<Sessao>();
                    value.add(item);
                    mapaSemana.put(item.getTratamento().getNomeTratamento(), value);
                }
            }else{
                if(mapaFeriado.containsKey(item.getTratamento().getNomeTratamento())){
                    mapaFeriado.get(item.getTratamento().getNomeTratamento()).add(item);
                }else{
                    List<Sessao> value = new ArrayList<Sessao>();
                    value.add(item);
                    mapaFeriado.put(item.getTratamento().getNomeTratamento(), value);
                }
            }
        }
    }
    
    public void criarListas(HashMap<String, List<Sessao>> mapa, List<Sessao> lista, double porcentagem){
        Iterator<String> it = mapa.keySet().iterator();
        
        while(it.hasNext()){
            String nomeTratamento = it.next();
            
            //pega o tratamento
            Tratamento tratamento = new Tratamento();
            tratamento.setNomeTratamento(nomeTratamento);
            tratamento = persisteTratamento.retornarTratamentoPeloNome(tratamento).get(0);
            
            int quantidadeClientes = mapa.get(nomeTratamento).size(); //quantidade de clientes
            quantidadeAtendimentos += quantidadeClientes;
            
            
            double valorTotal = retornarTotalValorSessao(mapa.get(nomeTratamento));
            
            //cria o objeto para inserir na lista
            Sessao temp = new Sessao(valorTotal, tratamento, quantidadeClientes);
            lista.add(temp);
        }
    }
    
    public double getTotalReceber(){
        double soma = 0.0;
        //(retornarTotalPorcentagem($F{tratamento}.getValorTratamento(),30) * $F{quantidadeClientes})
        for(Sessao item: listaSemana){
            soma += Relatorios.retornarTotalPorcentagem(item.getTratamento().getValorTratamento(), 30) 
                    * item.getQuantidadeClientes();
        }
        
        //(retornarTotalPorcentagem($F{tratamento}.getValorTratamento(),30) * $F{quantidadeClientes})
        for(Sessao item: listaFeriado){
            soma += Relatorios.retornarTotalPorcentagem(item.getTratamento().getValorTratamento(), 37.5) 
                    * item.getQuantidadeClientes();
        }
        
        return soma;
    }
    
    public double retornarTotalValorSessao(List<Sessao> lista){
        double soma = 0.0;
        
        for(Sessao item: lista){
            soma += item.getValorSessao();
        }
        
        return soma;
    }
    
    
    public void chamarRelatorio(){
        if(!validarData() || !validarFuncionario()) return;
        
        criarMapas();
        
        //cria as listas
        criarListas(mapaSemana, listaSemana, 30);
        criarListas(mapaFeriado, listaFeriado, 37.5);
        ordenarLista(listaSemana);
        ordenarLista(listaFeriado);
        
        String observacao = txtObservacoes.getText().trim();
        chamadaRelatorios.atendimentoPorPeriodo(
                inicio, fim, //data
                listaSemana,listaFeriado, listaRecebimentos, //listas
                quantidadeAtendimentos, getTotalReceber(),  //valores
                observacao, //observação
                funcionario
        );
        
        mapaSemana.clear();
        mapaFeriado.clear();
        
        listaRecebimentos.clear();
        listaSemana.clear();
        listaFeriado.clear();
        
        
    }
    
    /**
     * Ordena a lista pelo tratamento
     * @param lista 
     */
    public void ordenarLista(List<Sessao> lista){
        Collections.sort(lista, new Comparator<Sessao>() {

            @Override
            public int compare(Sessao o1, Sessao o2) {
                return o1.getTratamento().getNomeTratamento().compareToIgnoreCase(o2.getTratamento().getNomeTratamento());
            }
        });
    }

    public AtendimentosPorPeriodo() {
        initComponents();
        inicializarTela();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jDDataInicio = new com.toedter.calendar.JDateChooser();
        jLabel1 = new javax.swing.JLabel();
        jBGerarRelatorio = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        txtObservacoes = new javax.swing.JTextArea();
        jLabel3 = new javax.swing.JLabel();
        jDDataFim = new com.toedter.calendar.JDateChooser();
        jLabel4 = new javax.swing.JLabel();
        jCFuncionario = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("ERP BEAUTY CENTER - Atendimentos Por Período");

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Dados para o Relatório", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));

        jLabel1.setText("Início");

        jBGerarRelatorio.setText("Gerar Relatório");
        jBGerarRelatorio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jBGerarRelatorioActionPerformed(evt);
            }
        });

        jLabel2.setText("Observações");

        txtObservacoes.setColumns(20);
        txtObservacoes.setRows(5);
        txtObservacoes.setAutoscrolls(false);
        jScrollPane1.setViewportView(txtObservacoes);

        jLabel3.setText("Fim");

        jLabel4.setText("Funcionario");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(8, 8, 8)
                        .addComponent(jLabel2))
                    .addComponent(jLabel4)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jCFuncionario, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(jDDataInicio, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jDDataFim, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 432, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addGap(18, 18, 18)
                .addComponent(jBGerarRelatorio, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jBGerarRelatorio, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(49, 49, 49))
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jDDataInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jDDataFim, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(jCFuncionario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addGap(79, 79, 79))))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jBGerarRelatorioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBGerarRelatorioActionPerformed
        chamarRelatorio();
    }//GEN-LAST:event_jBGerarRelatorioActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jBGerarRelatorio;
    private javax.swing.JComboBox jCFuncionario;
    private com.toedter.calendar.JDateChooser jDDataFim;
    private com.toedter.calendar.JDateChooser jDDataInicio;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea txtObservacoes;
    // End of variables declaration//GEN-END:variables
}